/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.Collection;

import org.hibernate.Criteria;
import org.hibernate.Hibernate;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOSede;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.entidad.Proveedor;
import pe.com.cotelasa.scp.entidad.Sede;

/**
 *
 * @author DESARROLLO01
 */
@Repository("DaoSede")
public class DaoSedeImpl extends DaoImpl<Sede, Integer> implements IDAOSede,Serializable{
    
    @Autowired
    private SessionFactory sessionFactory;
    
    @Transactional
    public Sede buscarSedeAdministradora(Sede sede) throws DAOException{
        Sede sedeAdministradora = null;
        try {
            sessionFactory.getCurrentSession().flush();
            Criteria query =  sessionFactory.getCurrentSession().createCriteria(Sede.class)
                    .add(Restrictions.like("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("sedeAdministradora", sede.getSedeAdministradora()));
            if(sede.getIdProveedor() != null){
                sedeAdministradora = (Sede) query.add(Restrictions.eq("idProveedor", sede.getIdProveedor())).uniqueResult();
            }else if(sede.getIdCliente() != null){
                sedeAdministradora = (Sede) query.add(Restrictions.eq("idCliente", sede.getIdCliente())).uniqueResult();
            }
            
            return sedeAdministradora; 

        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

    }
    
    
    @Transactional
     public Collection<Sede> listaSedePorOrganizacion(Sede sede) throws DAOException{
        Collection<Sede> listaSedes = null;
        try {
            sessionFactory.getCurrentSession().flush();
            Criteria query =  sessionFactory.getCurrentSession().createCriteria(Sede.class)
                    .add(Restrictions.like("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()));
            if(sede.getIdProveedor() != null){
                listaSedes = query.add(Restrictions.eq("idProveedor", sede.getIdProveedor())).list();
            }else if(sede.getIdCliente() != null){
                listaSedes = query.add(Restrictions.eq("idCliente", sede.getIdCliente())).list();
            }else if(sede.getIdEmpresa() != null){
                listaSedes = query.add(Restrictions.eq("idEmpresa", sede.getIdEmpresa())).list();
            }
            
            return listaSedes; 

        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

    }
    
    @Transactional
     public Collection<Sede> listaSedePorEmpresa(int idEmpresa) throws DAOException{
        Collection<Sede> listaSedes = null;
        try {
            sessionFactory.getCurrentSession().flush();
            Criteria query =  sessionFactory.getCurrentSession().createCriteria(Sede.class)
                    .add(Restrictions.like("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("idEmpresa.id", idEmpresa))
                    .add(Restrictions.isNotNull("idEmpresa"));
                
                listaSedes = query.list();
            
            
            return listaSedes; 

        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }

    }
    
    
    @Transactional
	public Collection<Sede> listaSedePorProveedor(Proveedor proveedor)
			throws DAOException {
		Collection<Sede> listaSedes = null;
		try {
			sessionFactory.getCurrentSession().flush();
			Criteria query = sessionFactory
					.getCurrentSession()
					.createCriteria(Sede.class)
					.add(Restrictions.eq("idProveedor.id", proveedor.getId()))
					.add(Restrictions.eq("estadoRegistro",ESTADO_REGISTRO.ACTIVO.getValor()));
			listaSedes  = query.list();
			return listaSedes;

		} catch (Exception e) {
			throw new DAOException(e.getMessage(), e);
		}

	}
    
    @Transactional
    public Sede obtenerEntidadConUbigeo(Integer id) throws DAOException {
        try {
            Sede ent = (Sede) sessionFactory.getCurrentSession().createCriteria(Sede.class).add(Restrictions.idEq(id)).uniqueResult();
            Hibernate.initialize(ent.getIdUbigeo());
            return ent;
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
    }
}
